
//uniapp路由的包装函数


/**
 * 包装 uni.navigateTo
 * @param url 跳转页面地址
 * @param param 携带参数
 * @param otherParam 其他参数
 * @returns {Promise} uni.navigateTo运行结果
 */
export function navigateToMy(url, param = {}, otherParam) {
    if (url === null || url === undefined){
        console.log('url无效',url)
        return
    }
    url = url + getParamsStr(param)
    // console.log("navigateToMy-->" + url)
    return uni.navigateTo({
        url,
        ...otherParam,
        fail(e){
            console.log('路由跳转失败',e)
        },
    })
}

/**
 * 包装 uni.redirectTo
 * @param url 跳转页面地址
 * @param param 携带参数
 * @param otherParam 其他配合
 * @returns {Promise} uni.redirectTo运行结果
 */
export function redirectToMy(url, param = {}, otherParam) {
    if (url === null || url === undefined){
        console.log('url无效',url)
        return
    }
    url = url + getParamsStr(param)
    console.log("redirectToMy-->" + url)
    return uni.redirectTo({
        url,
        ...otherParam
    })
}

/**
 * 包装 uni.switchTab
 * @param url 跳转页面地址
 * @returns {Promise} uni.switchTab运行结果
 */
export function switchTabMy(url) {
    if (url === null || url === undefined){
        console.log('url无效',url)
        return
    }
    console.log("switchTabMy-->" + url)
    return uni.switchTab({
        url
    })
}

/**
 * 根据参数对象,组装为对应的字符串
 * @param param
 * @returns {string}
 */
function getParamsStr(param) {
    let str = ""
    //组装查询参数
    for (const [key, value] of Object.entries(param)) {
        if (value === undefined || value === null) {
            continue
        }
        str += `&${key}=${value}`
    }
    //加上 ? 并且去掉无用的字符->&
    if (str.length > 0) {
        str = "?" + str.substring(1)
    }
    return str
}

//包装uni的提示信息框

/**
 * 包装uni.showToast()
 * @param e
 * @param icon
 * @param config
 */
function showToast(e,icon,config){
    uni.showToast({
        icon,
        title: e,
        ...config
    })
}

/**
 * 展示成功信息(带图标)
 * @param e
 * @param config(可选)
 */
export function showSuccess(e,config){
    showToast(e,'success',config)
}
/**
 * 展示错误信息(带图标)
 * @param e
 * @param config(可选)
 */
export function showError(e,config) {
    console.log('e', e)
    showToast(e,'error',config)
}
/**
 * 展示信息
 * @param e
 * @param config(可选)
 */
export function showInfo(e,config){
    //支持表单校验不通过时的信息展示.
    if (e instanceof Array){
        showToast(e[0].message,'none',config)
        return
    }
    showToast(e,'none',config)
}




/**
 * uni.showModal Promise版本，无需title 指定config 为{title:""}
 *
 * @param content 提示内容
 * @param config 自定义配置
 * @returns {Promise<any>}
 */
export function showModalPromise(content, config) {
    return new Promise((resolve, reject) => {
        let obj = Object.assign({
            title: '重要提示',
            content: content
        }, config)
        uni.showModal({
            ...obj,
            success({confirm, cancel}) {
                if (confirm) {
                    return resolve(true)
                }
                if (cancel) {
                    return resolve(false)
                }
            },
            fail: reject
        })
    })
}

/**
 * 只有确定的弹出框
 *
 * @param content 弹出内容
 * @param config 自定义配置
 */
export function showModal(content, config) {
    console.log(content)
    // 如果 content 是一个数组,取第0个
    if (Array.isArray(content)) {
        if (content.length > 0) {
            content = content[0].message
        }
    }
    let obj = Object.assign({
        title: '重要提示',
        content: content,
        showCancel: false,
    }, config)
    uni.showModal(obj)
}


/**
 * 获取 openId
 * @returns {Promise<*|string>}
 */
export async function getCode() {
    let [err, res] = await uni.login({
        provider: 'weixin',
        onlyAuthorize: true,
    })
    if (err !== null) {
        throw Error("获取code失败")
    }
    let {code} = res
    return code
}

/**
 * 选择图片.默认选择1张,选择一张时直接返回该张的图片地址(本地)
 * @param imgNumber
 * @param config
 * @returns {Promise<*>}
 */
export async function chooseImage(imgNumber = 1,config){
    let param = {
        count: imgNumber, //默认
        sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图，默认二者都有
        sourceType: ['album'], //从相册选择
    }
    let [err,res] = await uni.chooseImage({...param,...config})
    if (err){
        return Promise.reject(err)
    }
    let {tempFilePaths} = res
    //只上传一张照片时,为了方便.直接获取地址
    if (imgNumber === 1){
        return tempFilePaths[0]
    }
    return tempFilePaths

}
/**
 * 扫一扫封装
 * @returns {Promise<unknown>}
 */
export async function scanCode(){
    return new Promise((resolve,reject)=>{
        uni.scanCode({
            onlyFromCamera:false,
            scanType:'qrCode',
            success(res){
                resolve(res)
            },
            fail(reason){
                reject(reason)
            }
        })
    })
}

